#ifndef __UTILS_H__
#define __UTILS_H__
#include <grp.h>
#include <pwd.h>
#include <time.h>
#include <ctype.h>
#include <fcntl.h>
#include <netdb.h>
#include <stdio.h>
#include <dirent.h>
#include <unistd.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <syslog.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <openssl/evp.h>
#include <openssl/md5.h>
#include <mysql/mysql.h>

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <sys/epoll.h>
#include <sys/types.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <sys/sendfile.h>
#include <sys/sysmacros.h>
#include <l8w8jwt/algs.h>
#include <l8w8jwt/base64.h>
#include <l8w8jwt/claim.h>
#include <l8w8jwt/decode.h>
#include <l8w8jwt/encode.h>
#include <l8w8jwt/retcodes.h>
#include <l8w8jwt/util.h>
#include <l8w8jwt/version.h>

#define ARGC_CHECK(argc, num){              \
    if (argc != num){                       \
        fprintf(stderr, "argc error!\n");   \
        return -1;                          \
    }                                       \
}

#define ERROR_CHECK(ret, num, msg){ \
    if (ret == num){                \
        perror(msg);                \
        return -1;                  \
    }                               \
}

#define THREAD_ERROR_CHECK(ret, msg){                   \
    if (ret != 0){                                      \
        fprintf(stderr, "%s:%s\n", msg, strerror(ret)); \
    }                                                   \
}


typedef enum{
    CD,
    PWD,
    LS,
    PUTS,
    GETS,
    RM,
    MKDIR,
    RMDIR,
    LOGIN,
    LOGOUT,
    SIGNUP
}command;

int CreateSalt(char salt[21]);
int Md5(char *pwd, char *salt, char md5_value[33]);
int ReadMd5(int fd,char md5_value[33]);
int Token(char* user_name,char token_value[209]);

#endif //__UTILS_H__
